import type { FileInfo } from '#/api/openapi';

import { acceptHMRUpdate, defineStore } from 'pinia';

import { formatTime } from '#/utils/time';

// 本地文件历史记录项
export interface FileHistoryItem {
  id: string; // 本地生成的唯一ID
  file: FileInfo & { code: string }; // 文件信息和分享码
  lastDownloadTime: number; // 最后下载时间戳（毫秒）
  downloadCount: number; // 下载次数
  firstAccessTime: number; // 首次访问时间戳
}

interface FileHistoryState {
  history: FileHistoryItem[];
}

/**
 * 文件历史记录 Store
 */
export const useFileHistoryStore = defineStore('file-history', {
  state: (): FileHistoryState => ({
    history: [],
  }),

  getters: {
    // 获取所有文件历史记录（带格式化时间）
    getAllHistory: (state): (FileHistoryItem & { formattedTime: string })[] =>
      state.history.map((item) => ({
        ...item,
        formattedTime: formatTime(new Date(item.lastDownloadTime)),
      })),

    // 获取统计信息
    getStats: (state) => {
      const total = state.history.length;
      const totalDownloads = state.history.reduce(
        (sum, item) => sum + item.downloadCount,
        0,
      );

      return {
        total,
        totalDownloads,
      };
    },

    // 根据文件ID和分享码查找
    getByFileAndCode:
      (state) =>
      (
        fileId: number | string,
        code: string,
      ): (FileHistoryItem & { formattedTime: string }) | undefined => {
        const item = state.history.find(
          (item) => item.file.id === fileId && item.file.code === code,
        );
        return item
          ? {
              ...item,
              formattedTime: formatTime(new Date(item.lastDownloadTime)),
            }
          : undefined;
      },

    // 获取最近下载的文件记录
    getRecent:
      (state) =>
      (limit = 10): (FileHistoryItem & { formattedTime: string })[] => {
        return state.history.slice(0, limit).map((item) => ({
          ...item,
          formattedTime: formatTime(new Date(item.lastDownloadTime)),
        }));
      },

    // 检查文件是否已下载过
    hasDownloaded:
      (state) =>
      (fileId: number | string, code: string): boolean => {
        return state.history.some(
          (item) => item.file.id === fileId && item.file.code === code,
        );
      },
  },

  actions: {
    /**
     * 记录文件下载
     */
    recordFileDownload(file: FileInfo & { code: string }) {
      // 检查是否已存在相同的文件记录
      const existingIndex = this.history.findIndex(
        (item) => item.file.id === file.id && item.file.code === file.code,
      );

      if (existingIndex === -1) {
        // 如果不存在，创建新记录
        const historyItem: FileHistoryItem = {
          id: `file-${Date.now()}-${file.id}`,
          file,
          lastDownloadTime: Date.now(),
          downloadCount: 1,
          firstAccessTime: Date.now(),
        };

        // 添加到历史记录顶部
        this.history.unshift(historyItem);

        // 限制历史记录数量，最多保留100条
        if (this.history.length > 100) {
          this.history = this.history.slice(0, 100);
        }
      } else {
        // 如果已存在，更新下载时间和计数，并移到最前面
        const existingItem = this.history[existingIndex];
        if (existingItem) {
          existingItem.downloadCount++;
          existingItem.lastDownloadTime = Date.now();
          // 移到最前面
          this.history.splice(existingIndex, 1);
          this.history.unshift(existingItem);
        }
      }
    },

    /**
     * 删除文件历史记录
     */
    removeFileHistory(id: string) {
      const index = this.history.findIndex((item) => item.id === id);
      if (index !== -1) {
        this.history.splice(index, 1);
      }
    },

    /**
     * 根据文件ID和分享码删除记录
     */
    removeByFileAndCode(fileId: number | string, code: string) {
      const index = this.history.findIndex(
        (item) => item.file.id === fileId && item.file.code === code,
      );
      if (index !== -1) {
        this.history.splice(index, 1);
      }
    },

    /**
     * 清空所有文件历史记录
     */
    clearHistory() {
      this.history = [];
    },

    /**
     * 获取所有文件数据（按最后下载时间排序）
     */
    getAllFiles(): (FileInfo & { code: string })[] {
      return this.history.map((item) => ({
        ...item.file,
        downloadCount: item.downloadCount, // 使用本地记录的下载次数
      }));
    },

    /**
     * 初始化示例数据（开发用）
     */
    initSampleData() {
      if (this.history.length === 0) {
        this.history = [];
      }
    },
  },

  // 持久化配置
  persist: {
    key: 'file-history',
    storage: localStorage,
    pick: ['history'], // 只持久化 history 字段
  },
});

// 解决热更新问题
const hot = import.meta.hot;
if (hot) {
  hot.accept(acceptHMRUpdate(useFileHistoryStore, hot));
}
